python3小白课:封装和隐藏

封装(Encapsulation)是面向对象的三大特征之一,它将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。

我们在上一节课的小案例中可以通过property函数来实现小小的封装和隐藏,让某些实例变量的设定和获取可以通过特定的方法进行。

但仅仅是这样隐藏还是不够的,这节课咱们来教大家黑科技,那就是说可以在实例变量或者实例方法前面加两个_也就是__就可以实现变量或者方法的隐藏。

我们来看个例子:

# coding:utf-8
class Student:
    def __hide(self):
        print("我是隐藏的方法,你能调用我吗?")
    def getname(self):
        return self.__name
    def setname(self, name):
           print("进行了设置")
        self.__name = name
    this_name = property(getname, setname)
s = Student()
s.this_name = "小白白"
print(s.this_name)
s.__name = "小黑黑"
print(s.this_name)
print(s.__name)

在这个例子中,我们设定了一个隐藏方法(这个后面讲),然后我们发现即使修改隐藏变量__name的值,this_name属性的值也不会被修改。

其实我们只需要关注this_name这个属性就好了,它的好处显而易见,那就是可以保证对于这个属性的修改是安全的,可以在赋值的时候增加一些逻辑控制。

好了,接下来我们再尝试一下在上述代码的基础上添加如下代码:

s.__hide()

运行后发现报错:AttributeError: 'Student' object has no attribute '__hide'

这意思就是说找不到这个方法,这个方法明明叫做这个呀,为什么报错呢?

这就是因为它被隐藏了!不能被直接调用。这也被称为变为类的私有方法。

但真的想调用怎么办?其实也是有办法的。

我们只需要改成这样:

s._Student__hide()

即可正常调用了。仔细研究一下,其实这是python设计者跟我们玩的一个小把戏,调用这种隐藏的方法的时候,需要在方法名前面,还加上一个_下划线和类名,比如我这里的_Student,再接上方法名即可。

从上述的表达我们可以知道,在python的类中其实也没有提供真正的隐藏机制(变成私有方法的机制),所有成员都是默认公开的,但能有这个小把戏也挺好的,不是么?

单词释义

单词 释义
hide 隐藏
AttributeError 属性错误
attribute 属性
Copyright © 雪山凌狐教程 all right reserved,powered by Gitbook该文件修订时间: 2020-09-19 12:40:46

results matching ""

    No results matching ""